import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:fucius/widgets/login/authentication.dart';


class LoginSignupPage extends StatefulWidget {
  LoginSignupPage({this.auth, this.loginCallback});

  final BaseAuth auth;
  final VoidCallback loginCallback;

  @override
  State<StatefulWidget> createState() => new _LoginSignupPageState();
}

class _LoginSignupPageState extends State<LoginSignupPage> {
  final _formKey = new GlobalKey<FormState>();

  String _email;
  String _password;
  String _errorMessage;

  bool _isLoginForm;
  bool _isLoading;

  // Check if form is valid before perform login or signup
  bool validateAndSave() {
    final form = _formKey.currentState;
    if (form.validate()) {
      form.save();
      return true;
    }
    return false;
  }

  // Perform login or signup
  void validateAndSubmit() async {
    setState(() {
      _errorMessage = "";
      _isLoading = true;
    });
    if (validateAndSave()) {
      String userId = "";
      try {
        if (_isLoginForm) {
          userId = await widget.auth.signIn(_email, _password);
          print('Signed in: $userId');
        } else {
          userId = await widget.auth.signUp(_email, _password);
          //widget.auth.sendEmailVerification();
          //_showVerifyEmailSentDialog();
          print('Signed up user: $userId');
          Firestore.instance.collection('talent').document(userId).setData({
            'Age': "Age",
            'Country': "Country",
            'Email': "Email",
            'Id': userId,
            'Major': "Major",
            'Name': "Name",
            "Phone": "Phone",
            "Resume": "Resume",
          });
        }
        setState(() {
          _isLoading = false;
        });


        if (userId.length > 0 && userId != null && _isLoginForm) {
          widget.loginCallback();
        }
      } catch (e) {
        print('Error: $e');
        setState(() {
          _isLoading = false;
          _errorMessage = e.message;
          _formKey.currentState.reset();
        });
      }
    }
  }

  @override
  void initState() {
    _errorMessage = "";
    _isLoading = false;
    _isLoginForm = true;
    super.initState();
  }

  void resetForm() {
    _formKey.currentState.reset();
    _errorMessage = "";
  }

  void toggleFormMode() {
    resetForm();
    setState(() {
      _isLoginForm = !_isLoginForm;
    });
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
        body: Stack(
          children: <Widget>[
            _showForm(),
            _showCircularProgress(),
          ],
        ));
  }

  Widget _showCircularProgress() {
    if (_isLoading) {
      return Center(child: CircularProgressIndicator());
    }
    return Container(
      height: 0.0,
      width: 0.0,
    );
  }

//  void _showVerifyEmailSentDialog() {
//    showDialog(
//      context: context,
//      builder: (BuildContext context) {
//        // return object of type Dialog
//        return AlertDialog(
//          title: new Text("Verify your account"),
//          content:
//              new Text("Link to verify account has been sent to your email"),
//          actions: <Widget>[
//            new FlatButton(
//              child: new Text("Dismiss"),
//              onPressed: () {
//                toggleFormMode();
//                Navigator.of(context).pop();
//              },
//            ),
//          ],
//        );
//      },
//    );
//  }

  Widget _showForm() {
    return new Container(
        padding: EdgeInsets.all(16.0),
        child: new Form(
          key: _formKey,
          child: new ListView(
            shrinkWrap: true,
            children: <Widget>[
              showLogo(),
              showEmailInput(),
              showPasswordInput(),
              showPrimaryButton(),
              showSecondaryButton(),
              showErrorMessage(),
            ],
          ),
        ));
  }

  Widget showErrorMessage() {
    if (_errorMessage.length > 0 && _errorMessage != null) {
      return new Text(
        _errorMessage,
        style: TextStyle(
            fontSize: 13.0,
            color: Colors.red,
            height: 1.0,
            fontWeight: FontWeight.w300),
      );
    } else {
      return new Container(
        height: 0.0,
      );
    }
  }

  Widget showLogo() {
    return new Hero(
      tag: 'hero',
      child: Padding(
        padding: EdgeInsets.fromLTRB(0.0, 70.0, 0.0, 0.0),
        child: CircleAvatar(
          backgroundColor: Colors.transparent,
          radius: 48.0,
          child: Image.asset('assets/flutter-icon.png'),
        ),
      ),
    );
  }

  Widget showEmailInput() {
    return Padding(
      padding: const EdgeInsets.fromLTRB(0.0, 100.0, 0.0, 0.0),
      child: new TextFormField(
        maxLines: 1,
        keyboardType: TextInputType.emailAddress,
        autofocus: false,
        decoration: new InputDecoration(
            hintText: 'Email',
            icon: new Icon(
              Icons.mail,
              color: Colors.grey,
            )),
        validator: (value) => value.isEmpty ? 'Email can\'t be empty' : null,
        onSaved: (value) => _email = value.trim(),
      ),
    );
  }

  Widget showPasswordInput() {
    return Padding(
      padding: const EdgeInsets.fromLTRB(0.0, 15.0, 0.0, 0.0),
      child: new TextFormField(
        maxLines: 1,
        obscureText: true,
        autofocus: false,
        decoration: new InputDecoration(
            hintText: 'Password',
            icon: new Icon(
              Icons.lock,
              color: Colors.grey,
            )),
        validator: (value) => value.isEmpty ? 'Password can\'t be empty' : null,
        onSaved: (value) => _password = value.trim(),
      ),
    );
  }

  Widget showSecondaryButton() {
    return new FlatButton(
        child: new Text(
            _isLoginForm ? 'Create an account' : 'Have an account? Sign in',
            style: new TextStyle(fontSize: 18.0, fontWeight: FontWeight.w300)),
        onPressed: toggleFormMode);
  }

  Widget showPrimaryButton() {
    return new Padding(
        padding: EdgeInsets.fromLTRB(0.0, 45.0, 0.0, 0.0),
        child: SizedBox(
          height: 40.0,
          child: new RaisedButton(
            elevation: 5.0,
            shape: new RoundedRectangleBorder(
                borderRadius: new BorderRadius.circular(30.0)),
            color: Colors.blue,
            child: new Text(_isLoginForm ? 'Login' : 'Create account',
                style: new TextStyle(fontSize: 20.0, color: Colors.white)),
            onPressed: validateAndSubmit,
          ),
        ));
  }
}

//class Validator {
//  static bool validateName(String text) {
//    return text
//        .contains(new RegExp(r"^[a-zA-Z]+(([',. -][a-zA-Z ])?[a-zA-Z]*)*$"));
//  }
//
//  static bool validateNumber(String text) {
//    Pattern pattern = r'^\D?(\d{3})\D?\D?(\d{3})\D?(\d{4})$';
//    RegExp regex = new RegExp(pattern);
//    return regex.hasMatch(text);
//  }
//
//  static bool validateEmail(String text) {
//    Pattern pattern =
//        r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$';
//    RegExp regex = new RegExp(pattern);
//    return regex.hasMatch(text);
//  }
//
//  static bool validatePassword(String text) {
//    return text.toString().length >= 6;
//  }
//}
//
//
//class SignInScreen extends StatefulWidget {
//  SignInScreen({this.auth});
//  final BaseAuth auth;
//  _SignInScreenState createState() => _SignInScreenState();
//}
//
//class _SignInScreenState extends State<SignInScreen> {
//  final TextEditingController _email = new TextEditingController();
//  final TextEditingController _password = new TextEditingController();
//  CustomTextField _emailField;
//  CustomTextField _passwordField;
//  bool _blackVisible = false;
//  VoidCallback onBackPress;
//
//  @override
//  void initState() {
//    super.initState();
//
//    onBackPress = () {
//      Navigator.of(context).pop();
//    };
//
//    _emailField = new CustomTextField(
//      baseColor: Colors.grey,
//      borderColor: Colors.grey[400],
//      errorColor: Colors.red,
//      controller: _email,
//      hint: "E-mail Adress",
//      inputType: TextInputType.emailAddress,
//      validator: Validator.validateEmail,
//    );
//    _passwordField = CustomTextField(
//      baseColor: Colors.grey,
//      borderColor: Colors.grey[400],
//      errorColor: Colors.red,
//      controller: _password,
//      obscureText: true,
//      hint: "Password",
//      validator: Validator.validatePassword,
//    );
//  }
//
//  @override
//  Widget build(BuildContext context) {
//    return WillPopScope(
//      onWillPop: onBackPress,
//      child: Scaffold(
//        body: Stack(
//          children: <Widget>[
//            Stack(
//              alignment: Alignment.topLeft,
//              children: <Widget>[
//                ListView(
//                  children: <Widget>[
//                    Padding(
//                      padding: const EdgeInsets.only(
//                          top: 70.0, bottom: 10.0, left: 10.0, right: 10.0),
//                      child: Text(
//                        "Sign In",
//                        softWrap: true,
//                        textAlign: TextAlign.left,
//                        style: TextStyle(
//                          color: Color.fromRGBO(212, 20, 15, 1.0),
//                          decoration: TextDecoration.none,
//                          fontSize: 24.0,
//                          fontWeight: FontWeight.w700,
//                          fontFamily: "OpenSans",
//                        ),
//                      ),
//                    ),
//                    Padding(
//                      padding: EdgeInsets.only(
//                          top: 20.0, bottom: 10.0, left: 15.0, right: 15.0),
//                      child: _emailField,
//                    ),
//                    Padding(
//                      padding: EdgeInsets.only(
//                          top: 10.0, bottom: 20.0, left: 15.0, right: 15.0),
//                      child: _passwordField,
//                    ),
//                    Padding(
//                      padding: const EdgeInsets.symmetric(
//                          vertical: 14.0, horizontal: 40.0),
//                      child: CustomFlatButton(
//                        title: "Log In",
//                        fontSize: 22,
//                        fontWeight: FontWeight.w700,
//                        textColor: Colors.white,
//                        onPressed: () {
//                          _emailLogin(
//                              email: _email.text,
//                              password: _password.text,
//                              context: context);
//                        },
//                        splashColor: Colors.black12,
//                        borderColor: Color.fromRGBO(212, 20, 15, 1.0),
//                        borderWidth: 0,
//                        color: Color.fromRGBO(212, 20, 15, 1.0),
//                      ),
//                    ),
//                    Padding(
//                      padding: const EdgeInsets.all(10.0),
//                      child: Text(
//                        "OR",
//                        softWrap: true,
//                        textAlign: TextAlign.center,
//                        style: TextStyle(
//                          color: Colors.black,
//                          decoration: TextDecoration.none,
//                          fontSize: 15.0,
//                          fontWeight: FontWeight.w300,
//                          fontFamily: "OpenSans",
//                        ),
//                      ),
//                    ),
//                    Padding(
//                      padding: const EdgeInsets.symmetric(
//                          vertical: 14.0, horizontal: 40.0),
//                      child: CustomFlatButton(
//                        title: "Facebook Login",
//                        fontSize: 22,
//                        fontWeight: FontWeight.w700,
//                        textColor: Colors.white,
//                        onPressed: () {
////                          _facebookLogin(context: context);
//                        },
//                        splashColor: Colors.black12,
//                        borderColor: Color.fromRGBO(59, 89, 152, 1.0),
//                        borderWidth: 0,
//                        color: Color.fromRGBO(59, 89, 152, 1.0),
//                      ),
//                    ),
//                  ],
//                ),
//                SafeArea(
//                  child: IconButton(
//                    icon: Icon(Icons.arrow_back),
//                    onPressed: onBackPress,
//                  ),
//                ),
//              ],
//            ),
//            Offstage(
//              offstage: !_blackVisible,
//              child: GestureDetector(
//                onTap: () {},
//                child: AnimatedOpacity(
//                  opacity: _blackVisible ? 1.0 : 0.0,
//                  duration: Duration(milliseconds: 400),
//                  curve: Curves.ease,
//                  child: Container(
//                    height: MediaQuery.of(context).size.height,
//                    color: Colors.black54,
//                  ),
//                ),
//              ),
//            ),
//          ],
//        ),
//      ),
//    );
//  }
//
//  void _changeBlackVisible() {
//    setState(() {
//      _blackVisible = !_blackVisible;
//    });
//  }
//
//  void _emailLogin(
//      {String email, String password, BuildContext context}) async {
//    if (Validator.validateEmail(email) &&
//        Validator.validatePassword(password)) {
//      try {
//        SystemChannels.textInput.invokeMethod('TextInput.hide');
//        _changeBlackVisible();
//        await widget.auth.signIn(email, password)
//            .then((uid) => Navigator.of(context).pop());
//      } catch (e) {
//        print("Error in email sign in: $e");
////        String exception = Auth.getExceptionText(e);
////        _showErrorAlert(
////          title: "Login failed",
////          content: exception,
////          onPressed: _changeBlackVisible,
////        );
//      }
//    }
//  }

//
//
//  void _showErrorAlert({String title, String content, VoidCallback onPressed}) {
//    showDialog(
//      barrierDismissible: false,
//      context: context,
//      builder: (context) {
//        return CustomAlertDialog(
//          content: content,
//          title: title,
//          onPressed: onPressed,
//        );
//      },
//    );
//  }
//}

//
//class SignUpScreen extends StatefulWidget {
//  _SignUpScreenState createState() => _SignUpScreenState();
//}
//
//class _SignUpScreenState extends State<SignUpScreen> {
//  final TextEditingController _fullname = new TextEditingController();
//  final TextEditingController _number = new TextEditingController();
//  final TextEditingController _email = new TextEditingController();
//  final TextEditingController _password = new TextEditingController();
//  CustomTextField _nameField;
//  CustomTextField _phoneField;
//  CustomTextField _emailField;
//  CustomTextField _passwordField;
//  bool _blackVisible = false;
//  VoidCallback onBackPress;
//
//  @override
//  void initState() {
//    super.initState();
//
//    onBackPress = () {
//      Navigator.of(context).pop();
//    };
//
//    _nameField = new CustomTextField(
//      baseColor: Colors.grey,
//      borderColor: Colors.grey[400],
//      errorColor: Colors.red,
//      controller: _fullname,
//      hint: "Full Name",
//      validator: Validator.validateName,
//    );
//    _phoneField = new CustomTextField(
//      baseColor: Colors.grey,
//      borderColor: Colors.grey[400],
//      errorColor: Colors.red,
//      controller: _number,
//      hint: "Phone Number",
//      validator: Validator.validateNumber,
//      inputType: TextInputType.number,
//    );
//    _emailField = new CustomTextField(
//      baseColor: Colors.grey,
//      borderColor: Colors.grey[400],
//      errorColor: Colors.red,
//      controller: _email,
//      hint: "E-mail Adress",
//      inputType: TextInputType.emailAddress,
//      validator: Validator.validateEmail,
//    );
//    _passwordField = CustomTextField(
//      baseColor: Colors.grey,
//      borderColor: Colors.grey[400],
//      errorColor: Colors.red,
//      controller: _password,
//      obscureText: true,
//      hint: "Password",
//      validator: Validator.validatePassword,
//    );
//  }
//
//  @override
//  Widget build(BuildContext context) {
//    return WillPopScope(
//      onWillPop: onBackPress,
//      child: Scaffold(
//        body: Stack(
//          children: <Widget>[
//            Stack(
//              alignment: Alignment.topLeft,
//              children: <Widget>[
//                ListView(
//                  children: <Widget>[
//                    Padding(
//                      padding: const EdgeInsets.only(
//                          top: 70.0, bottom: 10.0, left: 10.0, right: 10.0),
//                      child: Text(
//                        "Create new account",
//                        softWrap: true,
//                        textAlign: TextAlign.left,
//                        style: TextStyle(
//                          color: Color.fromRGBO(212, 20, 15, 1.0),
//                          decoration: TextDecoration.none,
//                          fontSize: 24.0,
//                          fontWeight: FontWeight.w700,
//                          fontFamily: "OpenSans",
//                        ),
//                      ),
//                    ),
//                    Padding(
//                      padding:
//                      EdgeInsets.only(top: 20.0, left: 15.0, right: 15.0),
//                      child: _nameField,
//                    ),
//                    Padding(
//                      padding:
//                      EdgeInsets.only(top: 10.0, left: 15.0, right: 15.0),
//                      child: _phoneField,
//                    ),
//                    Padding(
//                      padding:
//                      EdgeInsets.only(top: 10.0, left: 15.0, right: 15.0),
//                      child: _emailField,
//                    ),
//                    Padding(
//                      padding:
//                      EdgeInsets.only(top: 10.0, left: 15.0, right: 15.0),
//                      child: _passwordField,
//                    ),
//                    Padding(
//                      padding: const EdgeInsets.symmetric(
//                          vertical: 25.0, horizontal: 40.0),
//                      child: CustomFlatButton(
//                        title: "Sign Up",
//                        fontSize: 22,
//                        fontWeight: FontWeight.w700,
//                        textColor: Colors.white,
//                        onPressed: () {
//                          _signUp(
//                              fullname: _fullname.text,
//                              email: _email.text,
//                              number: _number.text,
//                              password: _password.text);
//                        },
//                        splashColor: Colors.black12,
//                        borderColor: Color.fromRGBO(59, 89, 152, 1.0),
//                        borderWidth: 0,
//                        color: Color.fromRGBO(59, 89, 152, 1.0),
//                      ),
//                    ),
//                  ],
//                ),
//                SafeArea(
//                  child: IconButton(
//                    icon: Icon(Icons.arrow_back),
//                    onPressed: onBackPress,
//                  ),
//                ),
//              ],
//            ),
//            Offstage(
//              offstage: !_blackVisible,
//              child: GestureDetector(
//                onTap: () {},
//                child: AnimatedOpacity(
//                  opacity: _blackVisible ? 1.0 : 0.0,
//                  duration: Duration(milliseconds: 400),
//                  curve: Curves.ease,
//                  child: Container(
//                    height: MediaQuery.of(context).size.height,
//                    color: Colors.black54,
//                  ),
//                ),
//              ),
//            ),
//          ],
//        ),
//      ),
//    );
//  }
//
//  void _changeBlackVisible() {
//    setState(() {
//      _blackVisible = !_blackVisible;
//    });
//  }
//
//  void _signUp(
//      {String fullname,
//        String number,
//        String email,
//        String password,
//        BuildContext context}) async {
//    if (Validator.validateName(fullname) &&
//        Validator.validateEmail(email) &&
//        Validator.validateNumber(number) &&
//        Validator.validatePassword(password)) {
//      try {
//        SystemChannels.textInput.invokeMethod('TextInput.hide');
//        _changeBlackVisible();
//        await widget.auth.signUp(email, password).then((uID) {
//          Auth.addUser(new User(
//              userID: uID,
//              email: email,
//              firstName: fullname,
//              profilePictureURL: ''));
//          onBackPress();
//        });
//      } catch (e) {
//        print("Error in sign up: $e");
//        String exception = Auth.getExceptionText(e);
//        _showErrorAlert(
//          title: "Signup failed",
//          content: exception,
//          onPressed: _changeBlackVisible,
//        );
//      }
//    }
//  }
//
//  void _showErrorAlert({String title, String content, VoidCallback onPressed}) {
//    showDialog(
//      barrierDismissible: false,
//      context: context,
//      builder: (context) {
//        return CustomAlertDialog(
//          content: content,
//          title: title,
//          onPressed: onPressed,
//        );
//      },
//    );
//  }
//}
